#include <iostream>
#include <fstream>
#include <string>
#include "Float.h"
#define NRO_EJERCICIO 1
#define VALOR 2
#define CANT_BITS_MANTISA 3
#define CANTVAL 33
#define CANTPRES 3

using namespace std;

Float polinomioTaylor(Float num, bool positivo, int cBit, bool muestraCantIteraciones, int &iter){
	bool signo= true;
	Float result(cBit, 0.0), anterior(cBit, 0.0), fact(cBit, 1.0), 
          pot(cBit, 1.0), i(cBit, 1.0), uno(cBit, 1.0), resultDivision(cBit,0.0);
	long cantIteraciones = 0;
	do{
		anterior= result;
		resultDivision = pot / fact;
		if (signo || positivo)
			result = result + resultDivision;	
		else {
			result = result - resultDivision;
		}
		pot= pot * num;
		fact= fact * i;
		i= i + uno;
		signo= !signo;
		cantIteraciones++;
	}while(result != anterior);
	//if(muestraCantIteraciones) 
		cout << "hola";
	iter= cantIteraciones;
	return anterior;
}


int main (int argc, char * const argv[]) {	
	
	Float er(52, 0.0);

	int it;
	bool muestraCantIteraciones = true;
	bool conDivision = false;
	int precisions[CANTPRES]= {5, 20, 50};
	double vals[CANTVAL]; //7
	vals[0]= 0.12518; 
	vals[1]= 0.25616;
	vals[2]= 0.36441; 
	vals[3]= 0.52355; 
	vals[4]= 0.76954; 
	vals[5]= 1.14815; 
	vals[6]= 1.38489; 
	vals[7]= 1.59844; 
	vals[8]= 1.79498;
	vals[9]= 2.15879;
	vals[10]= 2.34648;
	vals[11]= 2.54897;
	vals[12]= 2.78944;
	vals[13]= 2.95115;
	vals[14]= 3.24846;
	vals[15]= 3.58797;
	vals[16]= 3.78941;
	vals[17]= 4.01321;
	vals[18]= 4.56487;
	vals[19]= 4.98451;
	vals[20]= 5.22156;
	vals[21]= 5.52131;
	vals[22]= 5.71654;
	vals[23]= 6.00001;
	vals[24]= 6.32477;
	vals[25]= 6.62741;
	vals[26]= 6.92120;
	vals[27]= 7.32454;
	vals[28]= 7.74848;
	vals[29]= 7.91051;
	vals[30]= 8.32559;
	vals[31]= 8.60570;
	vals[32]= 8.88088; //13	
	


	ofstream fs("mediciones.txt"); 
	for (int i=0; i<CANTVAL; i++){
		Float one1(52, 1.0), mejorPrecision(52, vals[i]);
		mejorPrecision = polinomioTaylor(mejorPrecision, conDivision, 52, muestraCantIteraciones, it);		
		if (conDivision) 
			mejorPrecision = one1 / mejorPrecision;
		fs << vals[i];
		for (int j=0; j<CANTPRES; j++){
			Float val(precisions[j], vals[i]),
				  one(precisions[j], 1.0),
				  result(precisions[j], 0.0);
			result = polinomioTaylor(val, conDivision, precisions[j], muestraCantIteraciones, it);
			if (conDivision)
				result = one / result;
			er = ((mejorPrecision - result) / mejorPrecision);
			fs << "\t"  << it << "\t" << abs(er.getValue());
		}		
		fs << endl;
	}

	fs.close();

	return 0;
}
